home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / Onboard / utils.py < prev   
Encoding:
Python Source  |  2008-03-03  |  7.9 KB  |  237 lines

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os
  5.  
  6. from xml.dom import minidom
  7. from copy import deepcopy
  8.  
  9. from KeyGtk import * 
  10. import KeyCommon
  11.  
  12. INSTALL_DIR = '/usr/share/onboard'
  13.  
  14. modifiers = {"shift":1,"caps":2, "control":4, "mod1":8, "mod2":16, "mod3":32, "mod4":64, "mod5":128}
  15.  
  16.  
  17. modDic = {"LWIN" : ("Win",64),"RTSH" : ("‚áß".decode('utf-8'), 1), "LFSH" : ("‚áß".decode('utf-8'), 1), "RALT" : ("Alt Gr", 128), "LALT" : ("Alt", 8), "RCTL" : ("Ctrl", 4), "LCTL" : ("Ctrl", 4), "CAPS" : ("CAPS", 2), "NMLK" : ("Nm\nLk",16)}
  18.  
  19. otherDic = {"RWIN" : "Win","MENU" : "Menu" ,"BKSP" : "‚á¶".decode("utf-8"),"RTRN" : "Return", "TAB" : "Tab", "INS":"Ins", "HOME":"Hm", "PGUP": "Pg\nUp","DELE":"Del","END":"End","PGDN":"Pg\nDn", "UP":  "‚Üë".decode("utf-8"), "DOWN":"‚Üì".decode("utf-8"), "LEFT" : "‚Üê".decode("utf-8"), "RGHT" : "‚Üí".decode("utf-8"), "KP0" : "0", "KP1" : "1", "KP2" : "2", "KP3" : "3", "KP4" : "4", "KP5" : "5", "KP6" : "6", "KP7" : "7", "KP8" : "8", "KP9" : "9", "KPDL":"Del", "KPEN": "Ent" }
  20.  
  21. funcKeys = (("ESC",65307),("F1",65470),("F2",65471),("F3",65472),("F4", 65473),("F5", 65474),("F6",65475),("F7",65476),("F8",65477),("F9",65478),("F10",65479),("F11", 65480),("F12", 65481),
  22.             ("Prnt", 65377), ("Scroll", 65300),("Pause", 65299))
  23.             
  24.             
  25. keysyms = {"space" : 65408, "insert" : 0xff9e, "home" : 0xff50, "page_up" : 0xff55, "page_down" : 0xff56, "end" :0xff57, "delete" : 0xff9f, "return" : 65293, "backspace" : 65288}
  26.  
  27. def run_script(script,sok):
  28.         a =__import__(script)
  29.         a.run(sok)
  30.  
  31. def get_install_dir():
  32.         # ../../utils.py
  33.         thisFilePath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  34.  
  35.         # when run uninstalled
  36.         if os.path.isfile(os.path.join(thisFilePath,"data","onboard.svg")):
  37.             return thisFilePath
  38.         # when installed
  39.         elif os.path.isdir(INSTALL_DIR):
  40.             return INSTALL_DIR
  41.  
  42. def create_layout_XML(name,vk,sok):
  43.     "Reads layout stored within onBoard and outputs it to XML"
  44.     doc = minidom.Document()
  45.     
  46.     keyboard_element = doc.createElement("keyboard")
  47.     keyboard_element.setAttribute("id", name)
  48.     doc.appendChild(keyboard_element)
  49.     
  50.     
  51.     f = open(os.path.join(sok.SOK_INSTALL_DIR,"layouts","template.svg"))
  52.     baseDoc = minidom.parse(f)
  53.     f.close()
  54.     
  55.     paneDocs = []
  56.     for pane in sok.keyboard.panes:
  57.         paneDoc = deepcopy(baseDoc)
  58.         paneDocs.append(paneDoc)
  59.     
  60.     _create_pane_xml(sok.keyboard.basePane, doc, baseDoc, vk, name)
  61.     
  62.     for i in range(len(paneDocs)):
  63.         _create_pane_xml(sok.keyboard.panes[i], doc, paneDocs[i], vk, name)
  64.             
  65.     
  66.     #messy
  67.     docFile = open(os.path.join(os.path.expanduser("~"), ".sok", "layouts", "%s.sok" % name), 'w')
  68.     docFile.write(doc.toxml())
  69.     docFile.close()
  70.     
  71.     docFile = open(os.path.join(os.path.expanduser("~"), ".sok", "layouts", "%s-%s.svg" % (name,sok.keyboard.basePane.ident)), 'w')
  72.     docFile.write(baseDoc.toxml())
  73.     docFile.close()
  74.     
  75.     for i in range(len(paneDocs)):
  76.         docFile = open(os.path.join(os.path.expanduser("~"), ".sok", "layouts", "%s-%s.svg" % (name, sok.keyboard.panes[i].ident)), 'w')
  77.         docFile.write(paneDocs[i].toxml())
  78.         docFile.close()
  79.             
  80.                                                     
  81.     
  82. def _create_pane_xml(pane, doc, svgDoc, vk, name):
  83.     """
  84.     @type   pane: Onboard.Pane.Pane
  85.     @param  pane: Pane object that we are creating xml for.
  86.  
  87.     @type   doc: xml.dom.minidom.Document
  88.     @param  doc: DOM of .sok layout file.
  89.  
  90.     @type   svgDoc: xml.dom.minidom.Document.
  91.     @param  svgDoc: DOM of this panes SVG file.
  92.  
  93.     @type   vk:     Virtkey.Virtkey
  94.  
  95.     @type   name:   str
  96.     @param  name:   Name of layout to be created.
  97.  
  98.     """
  99.  
  100.     config_element  = _make_pane_config_xml(doc, pane.ident, 
  101.                         "%s-%s.svg" % (name,pane.ident),pane.rgba,pane.fontSize)
  102.  
  103.     doc.documentElement.appendChild(config_element)
  104.  
  105.     svgDoc.documentElement.setAttribute("width", str(pane.viewPortSizeX))
  106.     svgDoc.documentElement.setAttribute("height", str(pane.viewPortSizeY))
  107.  
  108.     for keyKey,keyVal in pane.keys.items():
  109.         if keyVal.__class__ == RectKey:
  110.             svgDoc.documentElement.appendChild(make_xml_rect(doc,
  111.                                             keyKey,
  112.                                             keyVal.x,
  113.                                             keyVal.y,
  114.                                             keyVal.width,
  115.                                             keyVal.height,
  116.                                             keyVal.rgba))
  117.         
  118.             config_element.appendChild(_make_key_xml(doc, keyKey, keyVal))
  119.             
  120.         elif keyVal.__class__ == LineKey:
  121.             print "funky keys not yet implemented"
  122.         
  123.         
  124.  
  125. def _make_pane_config_xml(doc,ident,filename,rgba,font):        
  126.     
  127.     pane_element = doc.createElement("pane")
  128.     
  129.     pane_element.setAttribute("id", ident)
  130.     pane_element.setAttribute("filename", filename)
  131.     pane_element.setAttribute("backgroundRed", str(rgba[0]))
  132.     pane_element.setAttribute("backgroundGreen", str(rgba[1]))
  133.     pane_element.setAttribute("backgroundBlue", str(rgba[2]))
  134.     pane_element.setAttribute("backgroundAlpha", str(rgba[3]))
  135.     pane_element.setAttribute("font", str(font))
  136.     
  137.     return pane_element
  138.     
  139. def make_xml_rect(doc,ident,x,y,width,height,rgba):
  140.     rect_element = doc.createElement("rect")
  141.         
  142.     rect_element.setAttribute("id",ident)
  143.     rect_element.setAttribute("x",str(x))
  144.     rect_element.setAttribute("y",str(y))
  145.     rect_element.setAttribute("width",str(width))
  146.     rect_element.setAttribute("height",str(height))
  147.  
  148.     rect_element.setAttribute("style","fill:#%s%s%s;stroke:#000000;" % (dec_to_hex_colour(rgba[0]),
  149.                                                             dec_to_hex_colour(rgba[1]),dec_to_hex_colour(rgba[2])))
  150.     
  151.     return rect_element
  152.  
  153. def dec_to_hex_colour(dec):
  154.     hexString = hex(int(255*dec))[2:]    
  155.     if len(hexString) == 1:
  156.         hexString = "0" + hexString
  157.         
  158.     return hexString
  159.         
  160.  
  161.  
  162. def _make_key_xml(doc, ident, key):
  163.  
  164.     key_element = doc.createElement("key")
  165.  
  166.     if ident in otherDic:
  167.         key_element.setAttribute("label", otherDic[ident]);
  168.  
  169.     if key.action_type != KeyCommon.KEYCODE_ACTION:
  170.         if key.labels:
  171.             if key.labels[0]:
  172.                 key_element.setAttribute("label",key.labels[0])
  173.             if key.labels[1]:
  174.                 key_element.setAttribute("cap_label",key.labels[1])
  175.             if key.labels[2]:
  176.                 key_element.setAttribute("shift_label",key.labels[2])
  177.             if key.labels[3]:
  178.                 key_element.setAttribute("altgr_label",key.labels[3])
  179.             if key.labels[4]:
  180.                 key_element.setAttribute("altgrNshift_label",key.labels[4])
  181.     
  182.     key_element.setAttribute("id",ident)
  183.         
  184.     if key.action_type == KeyCommon.CHAR_ACTION:
  185.         key_element.setAttribute("char", key.action)
  186.     elif key.action_type == KeyCommon.KEYSYM_ACTION:
  187.         key_element.setAttribute("keysym", str(key.action))
  188.     elif key.action_type == KeyCommon.KEYCODE_ACTION:
  189.         key_element.setAttribute("keycode", str(key.action))
  190.     elif key.action_type == KeyCommon.MODIFIER_ACTION:
  191.         for k,val in modifiers.items():
  192.             if key.action == val:
  193.                 key_element.setAttribute("modifier", k)
  194.     elif key.action_type == KeyCommon.MACRO_ACTION:
  195.         key_element.setAttribute("macro", str(key.action))
  196.     elif key.action_type == KeyCommon.SCRIPT_ACTION:
  197.         key_element.setAttribute("script", key.action)
  198.  
  199.     if key.fontOffsetX:
  200.         key_element.setAttribute("font_offset_x", key.fontOffsetX)
  201.  
  202.     if key.fontOffsetY:
  203.         key_element.setAttribute("font_offset_y", key.fontOffsetY)
  204.  
  205.     if key.sticky:
  206.         key_element.setAttribute("sticky", "true")
  207.     else:
  208.         key_element.setAttribute("sticky", "false")    
  209.  
  210.  
  211.     return key_element
  212.  
  213.  
  214. def matmult(m, v):
  215.     """ Matrix-vector multiplication """
  216.     nrows = len(m)
  217.     w = [None] * nrows
  218.     for row in range(nrows):
  219.         w[row] = reduce(lambda x,y: x+y, map(lambda x,y: x*y, m[row], v))
  220.     return w
  221.             
  222. if __name__=='__main__':
  223.     
  224.     from sys import argv
  225.     
  226.     
  227.     if argv[0]:
  228.         from virtkey import virtkey
  229.         from sok import Sok
  230.         s = Sok()
  231.         vk = virtkey()
  232.         create_layout_XML(argv[0],vk,s)
  233.     else:
  234.         print "Type name for personalised layout"
  235.     s.clean
  236.     
  237.